/*------------------------------------------------------------------------------
 * @file    SINGER_BUZZ.H
 * @author  嵌入式王子
 * @email   donminedm@163.com
 * @date    2024/07/18 21:28:59
 * @brief   开源的嵌入式软件包，本人不对此代码负责任
 * -----------------------------------------------------------------------------*/

#ifndef _SINGER_BUZZ_H_
#define _SINGER_BUZZ_H_

#include "main.h"
#include "tim.h"

// 蜂鸣器定时器
#define SINGER_BUZZ_TIM htim2

// 蜂鸣器PWM通道
#define SINGER_BUZZ_CHANNEL TIM_CHANNEL_1

// 定时器频率 72MHz
#define SINGER_BUZZ_TIM_CLK 72000000

// 自动重载寄存器
#define SINGER_BUZZ_TIM_ARR (1000 - 1)

// 定时器频率
// Tclk/(arr+1)=72000000/(1000)
#define SINGER_BUZZ_TIM_FREQ (SINGER_BUZZ_TIM_CLK / (SINGER_BUZZ_TIM_ARR + 1))

// 声音延迟函数，@HAL_Delay
#define SINGER_BUZZ_DELAY vTaskDelay

// Tout = ((arr+1)*(psc+1))/Tclk
// 494 = ( 1000 * ( PSC + 1 )) / 72000000
// 根据Tout= ((arr+1)*(psc+1))/Tclk推出psc值就是本句define定义的值，
// Tout为音调频率131Hz的倒数，Tclk=72MHz
/*
 * 低音
 */
typedef enum PSC_L_LIST
{
    L1 = ((SINGER_BUZZ_TIM_FREQ / 262) - 1), // 低调　do 的频率
    L2 = ((SINGER_BUZZ_TIM_FREQ / 296) - 1), // 低调　re 的频率
    L3 = ((SINGER_BUZZ_TIM_FREQ / 330) - 1), // 低调　mi 的频率
    L4 = ((SINGER_BUZZ_TIM_FREQ / 349) - 1), // 低调　fa 的频率
    L5 = ((SINGER_BUZZ_TIM_FREQ / 392) - 1), // 低调　sol 的频率
    L6 = ((SINGER_BUZZ_TIM_FREQ / 440) - 1), // 低调　la 的频率
    L7 = ((SINGER_BUZZ_TIM_FREQ / 494) - 1), // 低调　si 的频率
} PSC_L;

/*
 * 中音
 */
typedef enum PSC_M_LIST
{
    M1 = ((SINGER_BUZZ_TIM_FREQ / 523) - 1), // 中调　do 的频率
    M2 = ((SINGER_BUZZ_TIM_FREQ / 587) - 1), // 中调　re 的频率
    M3 = ((SINGER_BUZZ_TIM_FREQ / 659) - 1), // 中调　mi 的频率
    M4 = ((SINGER_BUZZ_TIM_FREQ / 699) - 1), // 中调　fa 的频率
    M5 = ((SINGER_BUZZ_TIM_FREQ / 784) - 1), // 中调　sol的频率
    M6 = ((SINGER_BUZZ_TIM_FREQ / 880) - 1), // 中调　la 的频率
    M7 = ((SINGER_BUZZ_TIM_FREQ / 988) - 1), // 中调　si 的频率
} PSC_M;

/*
 * 高音
 */
typedef enum PSC_H_LIST
{
    H1 = ((SINGER_BUZZ_TIM_FREQ / 1048) - 1), // 高调　do 的频率
    H2 = ((SINGER_BUZZ_TIM_FREQ / 1176) - 1), // 高调　re 的频率
    H3 = ((SINGER_BUZZ_TIM_FREQ / 1320) - 1), // 高调　mi 的频率
    H4 = ((SINGER_BUZZ_TIM_FREQ / 1480) - 1), // 高调　fa 的频率
    H5 = ((SINGER_BUZZ_TIM_FREQ / 1640) - 1), // 高调　sol的频率
    H6 = ((SINGER_BUZZ_TIM_FREQ / 1760) - 1), // 高调　la 的频率
    H7 = ((SINGER_BUZZ_TIM_FREQ / 1976) - 1), // 高调　si 的频率
} PSC_H;

#define PSC_ZERO 0 // 无声音

// 音乐节拍，每个音阶时长
typedef enum MUSIC_BEAT_LIST
{
    MUSIC_BEAT_4_4 = 250, // 4/4拍
} MUSIC_BEAT;

// 设置音阶 @PSC_H_LIST @PSC_M_LIST @PSC__LIST
void singer_buzz_set_note(uint16_t PSC_LIST);

// 设置音量  0.00 ~ 1.00   0.5f
void singer_buzz_set_vol(float vol);

// 停止播放
void singer_buzz_stop(void);

// 开启播放
void singer_buzz_start(void);

void singer_buzz_play(uint16_t *music, uint16_t music_len, MUSIC_BEAT beat);

#endif // !_SINGER_BUZZ_H_